import yaml
from pathlib import Path
from typing import Dict, Optional
from tools.path_utils import get_absolute_path, check_file_exists


def load_yaml_data(relative_path: Path, case_key: Optional[str] = None) -> Dict:
    """
    加载 YAML 文件数据（自动处理路径，支持按 key 提取子数据）
    :param relative_path: 相对于项目根目录的 YAML 路径（如 "data/login_case_backup.yaml"）
    :param case_key: 可选，提取 YAML 中指定 key 的数据（如 "locators"、"page_config"）
    :return: YAML 解析后的字典
    """
    # 1. 获取 YAML 文件绝对路径
    yaml_abs_path = get_absolute_path(relative_path)
    # 2. 提前检查文件是否存在（避免后续解析时才报错）
    check_file_exists(yaml_abs_path)

    # 3. 读取并解析 YAML（用 pathlib 的 open 方法，自动管理文件句柄）
    try:
        with yaml_abs_path.open(mode="r", encoding="utf-8") as f:
            yaml_data = yaml.safe_load(f) or {}  # 处理空文件（返回空字典）
    except yaml.YAMLError as e:
        raise ValueError(f"YAML 文件解析错误（{yaml_abs_path}）：{str(e)}")
    except Exception as e:
        raise Exception(f"读取 YAML 文件失败（{yaml_abs_path}）：{str(e)}")

    # 4. 按需提取子数据（如只取 "locators" 节点）
    if case_key and case_key in yaml_data:
        return yaml_data[case_key]
    return yaml_data